home *** CD-ROM | disk | FTP | other *** search
- // GenericSerial.c
- // Used on Mac & Palm platforms, for both the server/client apps
-
- #include "GenericSerial.h"
-
- #ifndef NULL
- #define NULL (0L)
- #endif
-
- static MyPacket gInPacket;
-
- static char gInBuf[kMaxExtraDataSize];
- static char gOutBuf[sizeof(MyPacket) + kMaxExtraDataSize];
-
-
- static void Reply(long p1, long p2, long p3, long p4, short dataSize, short result);
-
- static void Send(short op, long p1, long p2, long p3, long p4, short dataSize, char* bufP);
- static void Receive(long *p1, long *p2, long *p3, long *p4, short *resultP, char *bufP);
-
-
- // called repeatedly by main event loop of server application
- void ServeSomething(void)
- {
- short err;
- long filep;
- long numBytes, size, iterator;
- // request a message:
- err = SerialRead(sizeof(MyPacket), (char*)&gInPacket);
- if(err != 0) return; // (0 = noErr = errNone :-)
-
- // check the cookie so we know we're interpreting the data correctly
- if(gInPacket.cookie != kCookieValue) return;
- if(gInPacket.dataSize > kMaxExtraDataSize) return;
-
- if(gInPacket.dataSize > 0)
- {
- if(gInPacket.dataSize > kMaxExtraDataSize) return;
-
- err = SerialRead(gInPacket.dataSize, gInBuf);
- if(err != 0) return; // (0 = noErr = errNone :-)
- }
-
-
- switch(gInPacket.op)
- {
- case kDirEnumerate:
- // param1 - dirp
- // param2 - iterator
-
- err = LocalDirIterate(gInPacket.param1, &gInPacket.param2, gOutBuf, &size);
-
- // reply:
- // param1 - new iterator
- // result - result code
- // extra data - file name, etc...
- Reply(iterator, 0, 0, 0, size, err);
-
- break;
-
- case kFileOpen:
- // param1 - permissions
- // extra data - pathname
-
- // make sure we have a path:
- if(gInPacket.dataSize == 0) Reply(0,0,0,0,0,-1);
- err = LocalFileOpen(gInBuf, gInPacket.param1, &filep);
-
- // reply:
- // param1 - file ptr
- // result - result code
- Reply(filep, 0, 0, 0, 0, err);
-
- break;
-
- case kFileClose:
- // param1 - filep
-
- err = LocalFileClose(gInPacket.param1);
-
- // reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
- break;
-
- case kFileRead:
- // param1 - filep
- // param2 - numBytes
-
- numBytes = gInPacket.param2;
-
- if(numBytes > kMaxExtraDataSize) Reply(0,0,0,0,0,-1);
-
- // read the data...
- err = LocalFileRead(gInPacket.param1, numBytes, &numBytes, gOutBuf);
-
- // send the data back...
- // reply:
- // param1 - number of bytes read (in this message)
- // result - possibly error code
- Reply(numBytes, 0, 0, 0, numBytes, err);
-
- break;
-
- case kFileWrite:
- // param1 - filep
- // param2 - numBytes
- // extra data - data to write
-
- numBytes = gInPacket.param2;
-
- // sanity check:
- if(numBytes != gInPacket.dataSize) Reply(0,0,0,0,0,-1);
-
- // write the data...
- err = LocalFileWrite(gInPacket.param1, numBytes, &numBytes, gInBuf);
-
- // send the reply back...
- // reply:
- // param1 - number of bytes read (in this message)
- // result - possibly error code
- Reply(numBytes, 0, 0, 0, 0, err);
-
- break;
-
- case kFileSeek:
- // param1 - filep
- // param2 - origin
- // param3 - offset
-
- err = LocalFileSeek(gInPacket.param1, gInPacket.param2, gInPacket.param3);
-
- // reply:
- // result - result code
- Reply(0, 0, 0, 0, 0, err);
-
- break;
-
- case kFileSize:
- // param1 - filep
-
- err = LocalFileSize(gInPacket.param1, &size);
-
- // reply:
- // p1 - size of file
- // result - result code
- Reply(size, 0, 0, 0, 0, err);
-
- break;
-
- case kFileRename:
- // unimplemented
- DebugErr("rename unimplemented");
- break;
-
- case kFileDelete:
-
- break;
-
- }
-
-
- return;
- }
-
- // send a reply to client:
- void Reply(long p1, long p2, long p3, long p4, short dataSize, short result)
- {
- MyPacket outPacket;
- short err;
-
- // initialize outPacket:
- outPacket.cookie = kCookieValue;
- outPacket.op = kFileOpResult;
- outPacket.dataSize = dataSize;
- outPacket.result = result;
- outPacket.reserved = 0;
- outPacket.param1 = p1;
- outPacket.param2 = p2;
- outPacket.param3 = p3;
- outPacket.param4 = p4;
-
- err = SerialWrite(sizeof(MyPacket), (char*)&outPacket);
-
- if(err == 0 && dataSize > 0)
- {
- // send extra data, if any:
- err = SerialWrite(dataSize, gOutBuf);
- }
-
- return;
- }
-
- void Send(short op, long p1, long p2, long p3, long p4, short dataSize, char* bufP)
- {
- MyPacket outPacket;
- short err;
-
- if(bufP == 0) bufP = gOutBuf;
-
- // initialize outPacket:
- outPacket.cookie = kCookieValue;
- outPacket.op = op;
- outPacket.dataSize = dataSize;
- outPacket.result = 0;
- outPacket.reserved = 0;
- outPacket.param1 = p1;
- outPacket.param2 = p2;
- outPacket.param3 = p3;
- outPacket.param4 = p4;
-
- err = SerialWrite(sizeof(MyPacket), (char*)&outPacket);
-
- if(err == 0 && dataSize > 0)
- {
- // send extra data, if any:
- err = SerialWrite(dataSize, bufP);
- }
-
- return;
- }
-
-
- void Receive(long *p1, long *p2, long *p3, long *p4, short *resultP, char *bufP)
- {
- short err = SerialRead(sizeof(MyPacket), (char*)&gInPacket);
- if(err != 0) return; // (0 = noErr = errNone :-)
-
- // check the cookie so we know we're interpreting the data correctly
- if(gInPacket.cookie != kCookieValue) return;
- if(gInPacket.dataSize > kMaxExtraDataSize) return;
-
- if(p1) *p1 = gInPacket.param1;
- if(p2) *p2 = gInPacket.param2;
- if(p3) *p3 = gInPacket.param3;
- if(p4) *p4 = gInPacket.param4;
- if(resultP) *resultP = gInPacket.result;
- if(bufP == 0) bufP = gInBuf;
-
- if(gInPacket.dataSize > 0)
- {
- if(gInPacket.dataSize > kMaxExtraDataSize) return;
-
- err = SerialRead(gInPacket.dataSize, bufP);
- if(err != 0) return; // (0 = noErr = errNone :-)
- }
-
- }
-
- short RemoteFileRead(long filep, long numBytes, long *numBytesRead, char *bufP)
- {
- short result;
- long tempRead;
-
- result = 0; // (0 == noErr == errNone)
- *numBytesRead = 0;
-
- while(numBytes > 0 && result == 0)
- {
- tempRead = numBytes;
- if(tempRead > kMaxExtraDataSize) tempRead = kMaxExtraDataSize;
-
- // Send request & receive reply:
- Send(kFileRead, filep, tempRead, 0, 0, 0, NULL);
- Receive(&tempRead, NULL, NULL, NULL, &result, bufP);
-
- // we got tempRead bytes...
- bufP += tempRead;
- numBytes -= tempRead;
- *numBytesRead += tempRead;
-
- }
-
- return result;
- }
-
-
- short RemoteFileWrite(long filep, long numBytes, long *numWritten, char *bufP)
- {
- short result;
- long tempWrit;
-
- result = 0; // (0 == noErr == errNone)
- *numWritten = 0;
-
- while(numBytes > 0 && result == 0)
- {
- tempWrit = numBytes;
- if(tempWrit > kMaxExtraDataSize) tempWrit = kMaxExtraDataSize;
-
- // Send request & receive reply:
- Send(kFileWrite, filep, tempWrit, 0, 0, 0, bufP);
- Receive(&tempWrit, NULL, NULL, NULL, &result, NULL);
-
- // we write tempWrit bytes...
- bufP += tempWrit;
- numBytes -= tempWrit;
- *numWritten += tempWrit;
-
- }
-
- return result;
- }
-
-
-
- short RemoteFileOpen(char *path, long perm, long *filePP)
- {
- short result;
-
- Send(kFileOpen, perm, 0, 0, 0, StrLen(path)+1, path);
- Receive(filePP, 0, 0, 0, &result, NULL);
-
- return result;
- }
-
- short RemoteFileClose(long filep)
- {
- short result;
-
- Send(kFileClose, filep, 0, 0, 0, 0, NULL);
- Receive(0, 0, 0, 0, &result, NULL);
-
- return result;
- }
-
- short RemoteFileSeek(long filep, short origin, unsigned short offset)
- {
- short result;
-
- Send(kFileSeek, filep, origin, offset, 0, 0, NULL);
- Receive(0, 0, 0, 0, &result, NULL);
-
- return result;
- }
-
-
- short RemoteFileSize(long filep, long *size)
- {
- short result;
-
- Send(kFileSize, filep, 0, 0, 0, 0, NULL);
- Receive(size, 0, 0, 0, &result, NULL);
-
- return result;
- }
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-